package com.example.web.service.impl;

import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.example.admin.mapper.CategoryMapper;
import com.example.admin.service.CategoryService;
import com.example.xo.pojo.Category;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

/**
 * @author 王同学
 */
@Service
@Slf4j
public class CategoryServiceimpl implements CategoryService {
    //调用一下 mapper层
    @Autowired
    private CategoryMapper categoryMapper;
    @Override
    public boolean add(Category category) {
        //在新增的时候要判断是否重复，分类名不可重复（看需求文档）
        Category reslut = findByName(category.getCategoryName());
        //判断一下返回上来的结果
        if (reslut !=null){
            //如果不为空的话，说明分类名已经存在，所以不能重复创建
            //再给一点小提示,提示重复了
            log.info("分类{}重复了",category.getCategoryName());
            //那么就给他false
            return false;
        }
        //雪花算法加密 因为是string类型的所以要选择str
        String id = IdUtil.getSnowflakeNextIdStr();
        category.setCategoryId(id);

        //如果为空的话，就可以直接添加上去，说明没有重复的分类名
        int insert = categoryMapper.insert(category);
        //这边给的是int类型的，添加几条数据成功就会返回多少受影响
        //这边不做批量添加，所以就 返回1表示添加成功 不返回1就是失败
        log.info("添加了一个分类:{}",category);
        return insert==1;

    }

    @Override
    public boolean deleteById(String id) {
        //todo 这边需要做一个判断，判断分类下面是否有博客，有的话就不能删除
        //软删除实际上就是更新，用update去修改，比如存活的时候是0 软删除后，把他变成1 这样子。
        Category category=findById(id);
        //设置删除时间，让删除时间那一栏不为null
        category.setDeleted(LocalDateTime.now());
        //这个返回的是受影响的行数
        int update = categoryMapper.updateById(category);
        //如果大于0 那么就表示成了
        return update>0;
    }

    @Override
    public boolean update(Category category) {
        log.info("category{}",category);
        //在新增的时候要判断是否重复，分类名不可重复（看需求文档）
        Category reslut = findByName(category.getCategoryName());
        //判断一下返回上来的结果
        if (reslut !=null){
            //如果不为空的话，说明分类名已经存在，所以不能重复创建
            //再给一点小提示,提示重复了
            log.info("分类{}重复了",category.getCategoryName());
            //那么就给他false
            return false;
        }
        //设置一下最后的更新时间
        category.setUpdated(LocalDateTime.now());

        LambdaQueryWrapper<Category> wrapper=new LambdaQueryWrapper<>();

        wrapper.eq(Category::getCategoryId,category.getCategoryId());
        int up = categoryMapper.update(category,wrapper);
        log.info("up:{}",up);

        return up>0;
    }

    @Override
    public List<Category> findAll() {
            //改成倒序输出，就是把最新的放最上面
        LambdaQueryWrapper<Category> wrapper=new LambdaQueryWrapper<>();
        //倒叙输出
        wrapper.orderByDesc(Category::getCreated);
        //判断为空，才能进行输出
        wrapper.isNull(Category::getDeleted);
            log.info("查询了全部的数据：");
        return  categoryMapper.selectList(wrapper);
    }

    @Override
    public Category findById(String id) {
        LambdaQueryWrapper<Category> wrapper=new LambdaQueryWrapper<>();
            wrapper.eq(Category::getCategoryId,id);
            //判断不为空，才能进行输出
            wrapper.isNull(Category::getDeleted);
        return categoryMapper.selectOne(wrapper);
    }

    @Override
    public Category findByName(String name) {
        //这边做根据名字查找数据
        //数据库的这个写起来有点像 where 判断
        LambdaQueryWrapper<Category> wrapper=new LambdaQueryWrapper<>();
        //这边去写name是否相等,   获取的名字是否等于传进来的名字
        wrapper.eq(Category::getCategoryName,name);
        //然后返回查询的结果,如果为null那么就表示查无信息
        return  categoryMapper.selectOne(wrapper);
    }
}
